import tkinter as tk
from tkinter import ttk, messagebox
from database import DatabaseManager
from typing import List, Dict
import os
import sys
import pandas
import openpyxl


from gui.delete_window import DeleteEmployeesWindow
from gui.modify_window import ModifyEmployeesWindow
from gui.sort_window import SortEmployeesWindow


class ViewEmployeesWindow:
    def __init__(self, parent, icon_path="asset/OIP-C.ico"):
        self.parent = parent
        self.db = DatabaseManager()
        self.current_page = 1
        self.page_size = 10
        self.icon_path = icon_path  # 新增图标路径属性

        # 创建新窗口
        self.top = tk.Toplevel(parent)
        self.top.title("职工信息浏览")
        self.top.geometry("1000x600")
        self.top.protocol("WM_DELETE_WINDOW", self.on_close)

        # 设置窗口图标（新增代码）
        self._set_window_icon()

        # 创建工具栏按钮（修改此部分）
        toolbar = ttk.Frame(self.top)
        toolbar.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5)

        # 排序按钮（保持原有位置）
        sort_btn = ttk.Button(
            toolbar,
            text="排序",
            command=self.open_sort_window,
            width=10
        )
        sort_btn.pack(side=tk.LEFT, padx=5)

        # 新增删除按钮（排在排序按钮右侧）
        delete_btn = ttk.Button(
            toolbar,
            text="删除",
            command=self.open_delete_window,
            width=10
        )
        delete_btn.pack(side=tk.LEFT, padx=5)
        # 新增修改按钮（排在删除按钮右侧）
        modify_btn = ttk.Button(
            toolbar,
            text="修改",
            command=self.open_modify_window,
            width=10,
            style="Primary.TButton"
        )
        modify_btn.pack(side=tk.LEFT, padx=5)

        # 新增导出按钮（排在修改按钮右侧）
        export_btn = ttk.Button(
            toolbar,
            text="导出Excel",
            command=self.export_to_excel,
            width=10,
            style="Primary.TButton"  # 与修改按钮保持相同样式
        )
        export_btn.pack(side=tk.LEFT, padx=5)

        # 创建主框架
        main_frame = ttk.Frame(self.top, padding=10)
        main_frame.pack(fill=tk.BOTH, expand=True)

        # 创建Treeview表格
        self.create_treeview(main_frame)

        # 创建分页控件框架
        pagination_frame = ttk.Frame(self.top, padding=10)
        pagination_frame.pack(fill=tk.X)
        self.create_pagination_controls(pagination_frame)  # 修复点1

        # 初始加载数据
        self.load_data()
        print("数据库连接状态:", self.db._is_connected())  # 调试连接状态
        self.db._keepalive()  # 强制保持连接

    def export_to_excel(self):
        """ 导出所有数据到Excel文件 """
        try:
            # 1. 获取所有数据（假设数据库有get_all_employees方法）
            all_data = self.db.get_all_employees()
            if not all_data:
                messagebox.showinfo("提示", "当前没有可导出的数据")
                return

            # 2. 弹出保存对话框
            from tkinter import filedialog
            file_path = filedialog.asksaveasfilename(
                defaultextension=".xlsx",
                filetypes=[("Excel文件", "*.xlsx"), ("所有文件", "*.*")],
                title="导出Excel文件",
                initialfile="职工信息.xlsx"
            )
            if not file_path:  # 用户取消保存
                return

            # 3. 使用pandas写入Excel
            import pandas as pd
            columns = self.get_columns()
            df = pd.DataFrame(all_data, columns=columns)

            # 添加样式（可选）
            df.style.set_properties(**{'background-color': 'white', 'color': 'black'})

            # 4. 保存文件
            df.to_excel(file_path, index=False, engine='openpyxl')

            # 5. 显示成功提示
            messagebox.showinfo("导出成功",
                                f"数据已成功导出至：\n{os.path.abspath(file_path)}")


        except ImportError as e:

            messagebox.showerror("依赖缺失",

                                 f"完整错误信息：{str(e)}\n请检查Python环境配置")

            print("完整错误追踪：", e)  # 控制台会显示具体缺失的模块路径
        except Exception as e:
            messagebox.showerror("导出失败",
                                 f"发生错误：{str(e)}\n请检查控制台输出获取详细信息")
            print(f"导出失败 - 错误详情：{str(e)}")

    def _set_window_icon(self):
        """设置窗口图标（新增方法）"""
        if not self.icon_path:
            return

        try:
            # 尝试设置窗口图标
            if sys.platform == "win32":
                self.top.iconbitmap(self.icon_path)
            else:
                # macOS/Linux使用PhotoImage方式
                img = tk.PhotoImage(file=self.icon_path)
                self.top.call('wm', 'iconphoto', self.top._w, img)

        except Exception as e:
            messagebox.showwarning("图标加载失败",
                                   f"图标加载失败：{os.path.basename(self.icon_path)}\n"
                                   f"错误详情：{str(e)}\n"
                                   f"当前路径：{os.path.abspath(self.icon_path)}")

    def open_sort_window(self):
        """ 从数据窗口打开排序窗口 """
        # 传递三个参数：父窗口、视图窗口实例、数据库实例
        SortEmployeesWindow(
            parent_window=self.top,
            view_window=self,
            db_manager=self.db
        )

    def open_delete_window(self):
        """ 打开删除窗口 """
        try:
            DeleteEmployeesWindow(
                parent=self.top,
                view_window=self,
                db_manager=self.db
            )
        except Exception as e:
            messagebox.showerror("错误", f"打开删除窗口失败：{str(e)}")

    def open_modify_window(self):
        """ 打开修改窗口 """
        try:
            ModifyEmployeesWindow(
                parent=self.top,
                view_window=self,
                db_manager=self.db
            )
        except Exception as e:
            messagebox.showerror("错误", f"打开修改窗口失败：{str(e)}")

    def create_treeview(self, container):
        """ 创建带滚动条的Treeview（修复版） """
        # 1. 先创建Treeview主体
        self.treeview = ttk.Treeview(
            container,
            columns=self.get_columns(),
            show="headings",
            selectmode="browse"
        )

        # 2. 创建垂直滚动条（此时self.treeview已存在）
        vsb = ttk.Scrollbar(
            container,
            orient=tk.VERTICAL,
            command=self.treeview.yview  # 现在可以安全引用
        )

        # 3. 创建水平滚动条
        hsb = ttk.Scrollbar(
            container,
            orient=tk.HORIZONTAL,
            command=self.treeview.xview
        )

        # 4. 绑定滚动条到Treeview
        self.treeview.configure(
            yscrollcommand=vsb.set,
            xscrollcommand=hsb.set
        )

        # 5. 布局控件（先放滚动条保证显示顺序）
        vsb.pack(side=tk.RIGHT, fill=tk.Y)
        hsb.pack(side=tk.BOTTOM, fill=tk.X)
        self.treeview.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

        # 6. 配置列标题和宽度
        for col in self.treeview["columns"]:
            self.treeview.heading(col, text=col.capitalize())
            self.treeview.column(col, width=100, anchor=tk.CENTER)

        # 7. 绑定配置事件（可选）
        self.treeview.bind("<Configure>", self.auto_resize_columns)

    def get_columns(self) -> List[str]:
        """ 获取需要显示的列字段 """
        return [
            "employee_id", "name", "age", "gender",
            "education", "salary", "address", "phone"
        ]

    def auto_resize_columns(self, event=None):
        """ 自动调整列宽（根据内容） """
        columns = self.treeview["columns"]
        for col in columns:
            self.treeview.column(
                col,
                width=self.treeview.winfo_width() // len(columns),
                minwidth=80
            )

    def autoscroll(self, sbar, first, last):
        """ 同步滚动条位置 """
        first, last = float(first), float(last)
        if first <= 0 and last >= 1:
            sbar.set(0, 1)
        else:
            sbar.set(first, last)

    def create_pagination_controls(self, container):
        """ 创建分页控件（修复版） """
        # 当前页码显示
        self.page_label = ttk.Label(container, text="第 1 页")
        self.page_label.pack(side=tk.LEFT, padx=5)

        # 上一页按钮（绑定到实例）
        self.prev_btn = ttk.Button(  # 修复点2
            container,
            text="上一页",
            command=self.prev_page,
            state=tk.DISABLED  # 初始禁用
        )
        self.prev_btn.pack(side=tk.LEFT, padx=5)

        # 下一页按钮（绑定到实例）
        self.next_btn = ttk.Button(  # 修复点3
            container,
            text="下一页",
            command=self.next_page
        )
        self.next_btn.pack(side=tk.LEFT, padx=5)

    def load_data(self):
        self.db._keepalive()  # 确保连接有效
        try:
            # 获取分页数据
            data, total = self.db.get_employees_paginated(
                self.current_page,
                self.page_size
            )

            # 更新Treeview数据
            self.update_treeview(data)

            # 计算总页数
            total_pages = (total + self.page_size - 1) // self.page_size

            # 更新分页UI
            self.page_label.config(
                text=f"第 {self.current_page} 页 / 共 {total_pages} 页"
            )

            # 更新按钮状态
            self.prev_btn.state(['disabled' if self.current_page == 1 else '!disabled'])
            self.next_btn.state(['disabled' if self.current_page >= total_pages else '!disabled'])

            # 调试代码
            print(f"正在加载第 {self.current_page} 页数据...")
            print(f"获取到 {len(data)} 条记录，总记录数 {total}")

        except Exception as e:
            messagebox.showerror("数据加载失败", f"错误信息: {str(e)}")

    # 删除重复的prev_page/next_page定义
    def prev_page(self):
        """ 上一页 """
        if self.current_page > 1:
            self.current_page -= 1
            self.load_data()

    def next_page(self):
        """ 下一页 """
        total = self.db.get_employee_count()
        total_pages = (total + self.page_size - 1) // self.page_size
        if self.current_page < total_pages:
            self.current_page += 1
            self.load_data()

    def update_treeview(self, data: List[Dict]):
        """ 更新Treeview显示内容 """
        # 清空现有数据
        for item in self.treeview.get_children():
            self.treeview.delete(item)

        # 插入新数据
        columns = self.get_columns()
        for row in data:
            values = [str(row[col]) for col in columns]
            self.treeview.insert(
                "",
                tk.END,
                values=values,
                tags=("even", "odd")[len(values) % 2]  # 交替行颜色
            )

        print("更新Treeview，数据行数:", len(data))

    def on_close(self):
        """ 窗口关闭处理 """
        self.db.close()
        self.top.destroy()


